package com.microcore.jfreechart;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.*;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.data.category.DefaultCategoryDataset;

import java.awt.*;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;


/**
 * 折线图
 * <p>
 * 创建图表步骤：<br/>
 * 1：创建数据集合<br/>
 * 2：创建Chart：<br/>
 * 3:设置抗锯齿，防止字体显示不清楚<br/>
 * 4:对柱子进行渲染，<br/>
 * 5:对其他部分进行渲染<br/>
 * 6:使用chartPanel接收<br/>
 *
 * </p>
 */
public class LineChart {
    private LineChart() {
    }

    public static void main(String[] args) throws Exception {
        ChartUtils.saveAsFile(new LineChart().getJFreeChart(),
                "C:/Users/21099/Desktop/折线图.png", 1024, 420);

        //new LineChart().createData();
    }

    //使用窗口形式显示
    //private void test1() {
    //    final JFrame frame = new JFrame();
    //    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //    frame.setSize(1024, 420);
    //    frame.setLocationRelativeTo(null);
    //
    //    SwingUtilities.invokeLater(() -> {
    //        // 创建图形
    //        ChartPanel chartPanel = new LineChart().createChart();
    //        frame.getContentPane().add(chartPanel);
    //        frame.setVisible(true);
    //    });
    //}


    private JFreeChart getJFreeChart() {
        // 2：创建Chart[创建不同图形]  折线图/时序图
        JFreeChart chart = ChartFactory.createLineChart("折线图",
                "x轴标题", "y轴标题", createData());
        // 3:设置抗锯齿，防止字体显示不清楚
        ChartUtils.setAntiAlias(chart);// 抗锯齿
        // 4:对柱子进行渲染[[采用不同渲染]]

        ChartUtils.setLineRender(chart.getCategoryPlot(), false, true);//折线图

        // 5:对其他部分进行渲染
        ChartUtils.setXAixs(chart.getCategoryPlot());// X坐标轴渲染
        ChartUtils.setYAixs(chart.getCategoryPlot());// Y坐标轴渲染

        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));

        //使用自定义样式
        test(chart);

        // 6:使用chartPanel接收
        return chart;
    }

    //折线图专用数据
    private DefaultCategoryDataset createData() {
        //时间
        List<String> x = new ArrayList<>(500);
        //方位预报值
        List<Double> y1 = new ArrayList<>(500);
        //方位角实测
        List<Double> y2 = new ArrayList<>(500);
        try {
            String path = "F:/微核科技/项目/2018-03-07 故障诊断编码设计工作/RR201612290085/M/1.dat";
            FileInputStream inputStream = new FileInputStream(path);
            InputStreamReader reader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(reader);
            //不要首行数据
            bufferedReader.readLine();

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                String[] body = line.split("\t");
                x.add(body[0]);
                y1.add(Double.parseDouble(body[4]));
                y2.add(Double.parseDouble(body[1]));
            }
            bufferedReader.close();
            reader.close();
            inputStream.close();
        } catch (IOException i) {

        }
        String[] v0 = new String[x.size()];
        x.toArray(v0);
        Double[] v1 = new Double[y1.size()];
        y1.toArray(v1);
        Double[] v2 = new Double[y2.size()];
        y2.toArray(v2);
        Vector<Serie> series = new Vector<Serie>();
        series.add(new Serie("方位预测值", v1));
        series.add(new Serie("方位角实测", v2));
        DefaultCategoryDataset dataset = ChartUtils.createDefaultCategoryDataset(series, v0);
        return dataset;
    }


    //用于测试y轴的显示范围
    private void test(JFreeChart chart) {
        //2.设置最大坐标范围
        CategoryPlot plot = chart.getCategoryPlot();
        ValueAxis axis = plot.getRangeAxis();
        axis.setUpperBound(25);//y轴最大值
        axis.setLowerBound(24);//y轴最小值

        //设置x轴显示间隔
        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);// 横轴 lable 的位置 横轴上的 Lable 45度倾斜 DOWN_45

        DateAxis dateAxis = new DateAxis();
        dateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.SECOND, 1));

        // 设置Y轴
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setLabelFont(new Font("宋书", Font.PLAIN, 15));
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());//Y轴显示整数
        rangeAxis.setAutoRangeMinimumSize(1);   //最小跨度
        rangeAxis.setUpperMargin(0.18);//上边距,防止最大的一个数据靠近了坐标轴。
        //rangeAxis.setLowerBound(0);   //最小值显示0
        rangeAxis.setAutoRange(false);   //不自动分配Y轴数据
        rangeAxis.setTickMarkStroke(new BasicStroke(1.6f));     // 设置坐标标记大小
        rangeAxis.setTickMarkPaint(Color.BLACK);     // 设置坐标标记颜色
        rangeAxis.setTickUnit(new NumberTickUnit(0.1));//每10个刻度显示一个刻度值

    }

}